/**
 * CtrlInterno.java
 *
 * Projeto: SGA-LEDS
 *
 * Rodrigo Soares Maia IFES - Instituto Federal do Espírito Santo - Campus Serra
 */
package controleInterno.cci;

import controleAtividades.cdp.Atividade;
import controleInterno.cdp.CategoriaTipo;
import controleInterno.cdp.Colaborador;
import controleInterno.cdp.Projeto;
import controleInterno.cdp.TipoAtividade;
import controleInterno.cdp.Usuario;
import controleInterno.cgt.AplControleInterno;
import controleAtividades.cgt.AplProjeto;
import controleAtividades.cgt.AplRelatorios;
import controleAtividades.cih.ArvoreAtividades;
import controleInterno.cih.BarraMenu;
import controleAtividades.cih.PagExecucao;
import controleAtividades.cih.PagFormAtividade;
import controleInterno.cih.PagFormCategoria;
import controleInterno.cih.PagGerenciaTipos;
import controleInterno.cih.PagPrincipal;
import controleAtividades.cih.PagRegistro;
import controleAtividades.cih.TabelaRegistro;
import controleInterno.cih.PagGerenciaColaboradores;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zul.Borderlayout;
import org.zkoss.zul.Div;
import org.zkoss.zul.Window;
import utilitario.utilitarioPessoa.cdp.Pessoa;

public class CtrlInterno
{
    public static final int SALVAR = 0;
    public static final int SALVAR_FILHA = 1;
    public static final int EDITAR = 2;
    public static final int CONSULTAR = 3;
    private static CtrlInterno instance = null;
    private PagPrincipal pagPrincipal;
    private BarraMenu pagBarraMenu;
    private ArvoreAtividades pagArvore = null;
    private PagExecucao pagExecucao = null;
    private PagFormAtividade pagFormAtividade;
    private PagGerenciaTipos pagGerenciaTipos;
    private PagGerenciaColaboradores pagGerenciaColaboradores = null;
    private PagFormCategoria pagFormCategoria;
    private PagRegistro pagRegistro;
    private TabelaRegistro tabelaRegistro = null;
    private Div barraMenu;
    private Window arvore;
    private Window winExecucao;

    public static CtrlInterno getInstance()
    {
        if (instance == null)
        {
            instance = new CtrlInterno();
        }
        return instance;
    }
    
    AplControleInterno aplCI = AplControleInterno.getInstance();
    AplRelatorios aplR = AplRelatorios.getInstance();

    //INTERFACE_BARRA_MENU
    public void setBarraMenu(BarraMenu pag)
    {
        this.pagBarraMenu = pag;
    }

    public void setLabelUsuario(String nomeUsuario)
    {
        this.pagBarraMenu.setUsuario(nomeUsuario);
    }

    public Component criarBarraMenu()
    {
        barraMenu = (Div) Executions.createComponents("/BarraMenu.zul", null, null);
        return barraMenu;
    }

    //INTERFACE_PAGINA_PRINCIPAL
    public void setPagPrincipal(PagPrincipal pag)
    {
        this.pagPrincipal = pag;
    }

    public Component abrirPaginaPrincipal()
    {
        return Executions.createComponents("/pagPrincipal.zul", null, null);
    }
    
    public void abrirPaginaProjeto()
    {
        this.pagPrincipal.montarPagProjetos();
    }

    public void redirecionarPaginaPrincipal()
    {
        Executions.sendRedirect("/pagPrincipal.zul"); //TODO dessa forma a url aparece :/
    }

    //COLABORADOR
    public Colaborador salvarColaborador(ArrayList<Object> argsColaborador)
    {
        Colaborador c = null;

        //TODO setar endereco corretamente

        c = aplCI.salvarColaborador(argsColaborador);
        
        pagGerenciaColaboradores.addColaborador(c);

        return c;
    }

    public Colaborador salvarColaborador(ArrayList<Object> argsColaborador, ArrayList<Object> argsUsuario)
    {
        Colaborador c = null;

        c = aplCI.salvarColaborador(argsColaborador);

        argsUsuario.add(c);

        aplCI.salvarUsuario(argsUsuario);
        
        pagGerenciaColaboradores.addColaborador(c);

        return c;
    }
    
    public Colaborador salvarColaborador(Map argsColaborador, Map argsUsuario)
    {
        Colaborador c = null;

        c = aplCI.salvarColaborador(argsColaborador);

        argsUsuario.put("pessoa", c);

        aplCI.salvarUsuario(argsUsuario);
        
        pagGerenciaColaboradores.addColaborador(c);

        return c;
    }

    public boolean apagarColaborador(Colaborador c)
    {
        Usuario u = aplCI.obterUsuario(c);

        //removendo usuario e consequentemente o colaborador correspondente
        return aplCI.apagarUsuario(u);
    }

    public Colaborador alterarColaborador(Colaborador colaborador)
    {
        Colaborador c = null;

        c = aplCI.alterarColaborador(colaborador);
        
        pagGerenciaColaboradores.refreshColaborador(c);

        return c;
    }

    public List<Colaborador> obterColaboradores()
    {
        return aplCI.obterColaboradores();
    }

    public Colaborador obterColaborador(Pessoa p)
    {
        return aplCI.obterColaborador(p);
    }

    public Usuario alterarUsuario(Usuario usuario)
    {
        Usuario u = null;

        u = aplCI.alterarUsuario(usuario);

        return u;
    }
    
    public Usuario alterarSenhaUsuario(Usuario usuario, String novaSenha)
    {
        Usuario u = null;

        u = aplCI.alterarSenhaUsuario(usuario, novaSenha);

        return u;
    }

    public Usuario obterUsuario(Colaborador c)
    {
        return aplCI.obterUsuario(c);
    }

    public Usuario login(String nome, String senha)
    {
        return aplCI.validarUsuario(nome, senha);
    }

    //INTERFACE_COLABORADOR
    public void setPagGerenciaColaboradores(PagGerenciaColaboradores pag)
    {
        this.pagGerenciaColaboradores = pag;
    }
    
    public Component abrirPagGerenciaColaboradores()
    {
        return Executions.createComponents("/pagGerenciaColaboradores.zul", null, null);
    }

    public Component abrirPagFormUsuario()
    {
        return Executions.createComponents("/pagFormUsuario.zul", null, null);
    }
    
    public Component abrirPagAlterarSenha(Usuario u)
    {
        Map map = new HashMap();
        map.put("usuario", u);
        
        return Executions.createComponents("/pagAlteraSenha.zul", null, map);
    }

    public void abrirIncluirColaborador()
    {
        Map map = new HashMap();
        map.put("tipo", SALVAR);
        Executions.createComponents("/pagFormUsuario.zul", null, map);
    }

    public void abrirEditarColaborador(Colaborador c)
    {
        Map map = new HashMap();
        map.put("tipo", EDITAR);
        map.put("obj", c);
        Executions.createComponents("/pagFormUsuario.zul", null, map);
    }
    
    public void abrirConsultarColaborador(Colaborador c)
    {
        Map map = new HashMap();
        map.put("tipo", CONSULTAR);
        map.put("obj", c);
        Executions.createComponents("/pagFormUsuario.zul", null, map);
    }

    //PROJETO
    public Projeto salvarProjeto(ArrayList<Object> argsProjeto)
    {
        Projeto p = null;

        p = aplCI.salvarProjeto(argsProjeto);

        pagPrincipal.addProjeto(p);

        return p;
    }

    public boolean apagarProjeto(Projeto p)
    {
        return aplCI.apagarProjeto(p);
    }

    public Projeto alterarProjeto(Projeto projeto, Colaborador colaborador)
    {
        Projeto p = null;

        p = aplCI.alterarProjeto(projeto);

        return p;
    }

    public List<Projeto> obterProjetos()
    {
        return aplCI.obterProjetos();
    }

    //INTERFACE_PROJETO
    public Component abrirPagFormProjeto()
    {
        return Executions.createComponents("/pagFormProjeto.zul", null, null);
    }

    public void abrirIncluirProjeto()
    {
        Map map = new HashMap();
        map.put("tipo", SALVAR);
        Executions.createComponents("/pagFormProjeto.zul", null, map);
    }

    public void abrirEditarProjeto(Projeto projeto)
    {
        Map map = new HashMap();
        map.put("tipo", EDITAR);
        map.put("obj", projeto);
        Executions.createComponents("/pagFormProjeto.zul.zul", null, map);
    }

    public void abrirConsultarProjeto(Projeto projeto)
    {
        Map map = new HashMap();
        map.put("tipo", CONSULTAR);
        map.put("obj", projeto);
        Executions.createComponents("/pagFormProjeto.zul.zul", null, map);
    }

    public void abrirConsultarProjeto(Atividade atividade)
    {
        Map map = new HashMap();
        map.put("tipo", CONSULTAR);
        map.put("obj", atividade);
        Executions.createComponents("/pagFormAtividade.zul.zul", null, map);
    } 
    
    //CATEGORIA
    public CategoriaTipo salvarCategoria(Map atributos)
    {
        CategoriaTipo c = null;

        c = aplCI.salvarCategoria(atributos);

        pagGerenciaTipos.addCategoria(c);

        return c;
    }
    
    public boolean apagarCategoria(CategoriaTipo c)
    {
        return aplCI.apagarCategoria(c);
    }

    public CategoriaTipo alterarCategoria(CategoriaTipo categoria)
    {
        CategoriaTipo c = null;

        c = aplCI.alterarCategoria(categoria);

        return c;
    }

    public List<CategoriaTipo> obterCategorias()
    {
        return aplCI.obterCategorias();
    }
    
    //INTERFACE_CATEGORIA
    public void abrirIncluirCategoria()
    {
        Map map = new HashMap();
        map.put("tipo", SALVAR);
        Executions.createComponents("/pagFormCategoria.zul", null, map);
    }
    
    public void abrirEditarCategoria(CategoriaTipo categoria)
    {
        Map map = new HashMap();
        map.put("tipo", EDITAR);
        map.put("obj", categoria);
        Executions.createComponents("/pagFormCategoria.zul", null, map);
    }
    
    public void setPagFormCategoria(PagFormCategoria pag)
    {
        this.pagFormCategoria = pag;
    }

    //TIPO
    public TipoAtividade salvarTipo(Map atributos)
    {
        TipoAtividade t = null;

        t = aplCI.salvarTipo(atributos);

        return t;
    }
    
    public boolean apagarTipo(TipoAtividade t)
    {
        return aplCI.apagarTipo(t);
    }

    public TipoAtividade alterarTipo(TipoAtividade tipo)
    {
        TipoAtividade t = null;

        t = aplCI.alterarTipo(tipo);

        return t;
    }
    
    public List<TipoAtividade> obterTipos()
    {
        return aplCI.obterTipos();
    }

    public List<TipoAtividade> obterTipos(CategoriaTipo ct)
    {
        return aplCI.obterTipos(ct);
    }

    public List<TipoAtividade> obterFilhas(TipoAtividade t)
    {
        return aplCI.obterFilhas(t);
    }
    
    public void trocaPai(TipoAtividade tipo, TipoAtividade novoPai)
    {
        aplCI.trocaPai(tipo, novoPai);
    }
    
    //INTERFACE_TIPO
    public Component abrirPagGerenciaTipos()
    {
        return Executions.createComponents("/pagGerenciaTipos.zul", null, null);
    }
    
    public Component abrirPagGerenciaTipos(boolean cadastro)
    {
        Map map = new HashMap();
        map.put("cadastro", cadastro);
        return Executions.createComponents("/pagGerenciaTipos.zul", null, map);
    }

    public Component criarArvoreTipos(CategoriaTipo ct, boolean cadastro)
    {
        Map map = new HashMap();
        map.put("categoria", ct);
        map.put("cadastro", cadastro);
        Div arvoreTipos = (Div) Executions.createComponents("/arvoreTipoAtividades.zul", null, map);
        return arvoreTipos;
    }

    public void setPagGerenciaTipos(PagGerenciaTipos pag)
    {
        this.pagGerenciaTipos = pag;
    }
}